home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok29.lha / CreateIcons / CreateIcons.imp < prev    next >
Text File  |  1993-08-15  |  5KB  |  210 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    CreateIcons.mod
  3.     :Author.     Fridtjof Siebert
  4.     :Address.    Nobileweg 67, D-7000-Stgt-40
  5.     :Phone.      0711/822509
  6.     :Shortcut.   [fbs]
  7.     :History.    V0.8, 06-Aug-88 [fbs]: CreateAmokDisk in M2
  8.     :History.    V1.0, 19-Nov-89 [fbs]: ported to OBERON
  9.     :Copyright.  PD
  10.     :Language.   OBERON
  11.     :Translator. AMOK OBERON Compiler V0.1.1
  12.     :Imports.    SecureDos [fbs]
  13.     :Imports.    Lists [fbs]
  14.     :Contents.   Icon creation tool. Kopiert die Icons aus ICONS: mit dem
  15.     :Contents.   xxx.info zu den Dateien abc.xxx.
  16.     :Usage.      CreateIcons <Disk or Directory>
  17. ---------------------------------------------------------------------------*)
  18.  
  19. DEFINITION CreateIcons; END CreateIcons.
  20.  
  21. IMPLEMENTATION CreateIcons;
  22.  
  23. IMPORT d:   Dos,
  24.             io,
  25.             Break,
  26.             NoGuru,
  27.        sd:  SecureDos,
  28.        li:  Lists,
  29.        arg: Arguments,
  30.        str: Strings,
  31.        ol:  OberonLib;
  32.  
  33.  
  34. TYPE String = ARRAY 80 OF CHAR;
  35.  
  36. VAR
  37.   Name: String;
  38.   LockPtr: d.FileLockPtr;
  39.   oldCD: d.FileLockPtr;
  40.  
  41.  
  42. PROCEDURE PutIcon(Iconname: ARRAY OF CHAR; to: ARRAY OF CHAR);
  43. (* Kopiert das Icon "ICONS:"+Iconname+".info" nach to *)
  44.  
  45. VAR
  46.   i,o: ARRAY 80 OF CHAR;
  47.   in,out: d.FileHandlePtr;
  48.   size: LONGINT;
  49.   buf: LONGINT;
  50.   CD: d.FileLockPtr;
  51.  
  52. BEGIN
  53.   o := ""; str.Append(o,to); str.Append(o,".info");
  54.  
  55.   in := sd.Open(ADR(o),d.oldFile);         (* exisitiert Icon schon? *)
  56.   IF in#NIL THEN sd.Close(in); RETURN END; (* Ja, dann zurück        *)
  57.  
  58.   CD := d.CurrentDir(oldCD);               (* Icon lesen:            *)
  59.   i := "ICONS/"; str.Append(i,Iconname); str.Append(i,".info");
  60.   in := sd.Open(ADR(i),d.oldFile);
  61.   CD := d.CurrentDir(CD);
  62.   IF in=NIL THEN
  63.     i := "ICONS:"; str.Append(i,Iconname); str.Append(i,".info");
  64.     in := sd.Open(ADR(i),d.oldFile);
  65.     IF in=NIL THEN RETURN END;
  66.   END;
  67.   size := d.Seek(in,0,d.end);
  68.   size := d.Seek(in,0,d.beginning);
  69.   IF size<=0 THEN RETURN END;
  70.   ol.New(buf,size); IF buf=NIL THEN RETURN END;
  71.   IF d.Read(in,buf,size)#size THEN RETURN END;
  72.   sd.Close(in);
  73.  
  74.   out := sd.Open(ADR(o),d.newFile);        (* Icon erzeugen          *)
  75.   IF out=NIL THEN RETURN END;
  76.   IF d.Write(out,buf,size)#0 THEN END;
  77.   sd.Close(out);
  78.   DISPOSE(buf);
  79.  
  80. END PutIcon;
  81.  
  82.  
  83. (*--------------------  Rekursive Hauptprozedur:  -------------------------*)
  84.  
  85.  
  86. PROCEDURE DoIt(lock: d.FileLockPtr; Depth: INTEGER);
  87.  
  88. TYPE
  89.   NameTypePtr = POINTER TO NameType;
  90.   NameType = RECORD (li.Node) name: String END;
  91.  
  92. VAR
  93.   FileInfo: d.FileInfoBlockPtr;
  94.   Err: LONGINT;
  95.   Lock2, old, exists: d.FileLockPtr;
  96.   FirstName, ActName: NameTypePtr;
  97.   node: li.NodePtr;
  98.   IconName: String;
  99.   pos: INTEGER;
  100.  
  101.  
  102.   PROCEDURE Tab;
  103.   VAR i: INTEGER;
  104.   BEGIN
  105.     i:=0; WHILE i<=Depth DO io.WriteString("  "); INC(i) END;
  106.   END Tab;
  107.  
  108.  
  109.   PROCEDURE oom;
  110.   BEGIN
  111.     io.WriteString("Out of memory!\n"); HALT(0);
  112.   END oom;
  113.  
  114.  
  115. BEGIN
  116.  
  117. (*------  Init:  ------*)
  118.  
  119.   FirstName := NIL;
  120.  
  121.   NEW(FileInfo);
  122.   IF FileInfo=NIL THEN oom END;
  123.  
  124.   old := d.CurrentDir(lock);
  125.  
  126.   IF d.Examine(lock,FileInfo) THEN
  127.     WHILE d.ExNext(lock,FileInfo) DO
  128.       IF FileInfo.dirEntryType>0 THEN   (* directory: *)
  129.  
  130.         str.Cut(FileInfo.fileName,0,SIZE(IconName),IconName);
  131.         PutIcon("dir",FileInfo.fileName);
  132.         Tab; io.WriteString(FileInfo.fileName);
  133.         io.WriteString("  (Directory)\n");
  134.         Lock2 := sd.Lock(ADR(FileInfo^.fileName),d.sharedLock);
  135.         IF Lock2#NIL THEN DoIt(Lock2,Depth+1) END;
  136.         sd.UnLock(Lock2);
  137.  
  138.       ELSE                               (* file: *)
  139.  
  140.         IF str.Occurs(FileInfo.fileName,".info")=-1 THEN
  141.           NEW(ActName);
  142.           IF ActName=NIL THEN oom END;
  143.           str.Cut(FileInfo.fileName,0,SIZE(ActName.name),ActName.name);
  144.           li.Add(FirstName,ActName^);
  145.         END;
  146.  
  147.       END;
  148.     END;
  149.   END;
  150.  
  151.   Err := d.IoErr();
  152.   IF (Err#d.noMoreEntries) THEN
  153.     Tab; io.WriteString("IO-Error: "); io.WriteInt(Err,6); io.WriteLn; HALT(0);
  154.   END;
  155.  
  156.   node := FirstName;         (* Icons erzeugen: *)
  157.   WHILE node#NIL DO
  158.     WITH node : NameType DO
  159.       Tab(); io.WriteString(node.name); io.WriteLn;
  160.       pos := str.Occurs(node.name,".");
  161.       IF pos=-1 THEN
  162.         IconName := "bin"
  163.       ELSE
  164.         str.Cut(node.name,pos+1,str.Length(node.name)-pos-1,IconName)
  165.       END;
  166.       PutIcon(IconName,node.name);
  167.     END;
  168.     node := node.next;
  169.   END;
  170.  
  171.   old := d.CurrentDir(old);   (* zurück zum alten Directory *)
  172.  
  173.   DISPOSE(FileInfo);          (* Speicher freigeben: *)
  174.   WHILE FirstName#NIL DO
  175.     ActName := FirstName;
  176.     li.Rem(FirstName,ActName^);
  177.     DISPOSE(ActName);
  178.   END;
  179.  
  180. END DoIt;
  181.  
  182.  
  183. BEGIN
  184.  
  185.   oldCD := ol.Me.currentDir;
  186.  
  187.   io.WriteString("Amok -- Icon creation tool. 1988 by Fridtjof Siebert\n");
  188.  
  189.   IF arg.NumArgs()#1 THEN
  190.     io.WriteString("Usage: CreateIcons <Name>\n"); HALT(0)
  191.   END;
  192.   arg.GetArg(1,Name);
  193.  
  194.   LockPtr := sd.Lock(ADR(Name),d.sharedLock);
  195.  
  196.   IF LockPtr=NIL THEN
  197.     io.WriteString("IO-Error: "); io.WriteInt(d.IoErr(),6); io.WriteLn;
  198.     HALT(0);
  199.   END;
  200.  
  201.   IF (Name#"") AND (Name[str.Length(Name)-1]=":") THEN   (* Diskicon *)
  202.     str.Append(Name,"disk");
  203.     PutIcon("disk",Name);
  204.   END;
  205.  
  206.   DoIt(LockPtr,0);
  207.   sd.UnLock(LockPtr);
  208.  
  209. END CreateIcons.
  210.